﻿using System.ComponentModel;

namespace CSNN.GUI
{
    /// <summary>
    /// Обозреваемый класс обучаещего множества для DataGrid
    /// </summary>
    public class TrainingImageInList : INotifyPropertyChanged
    {
        #region Члены класса
        
        /// <summary>
        /// Образ
        /// </summary>
        public TrainingImage Image;

        /// <summary>
        /// Порядковый номер
        /// </summary>
        private int _number;

        /// <summary>
        /// Флаг использования образа
        /// </summary>
        private bool _isUsing;

        /// <summary>
        /// Описание образа
        /// </summary>
        private string _discription;

        public event PropertyChangedEventHandler PropertyChanged;

        #endregion

        #region Конструкторы

        /// <summary>
        /// Конструктор
        /// </summary>
        /// <param name="inDemension">Размерность входных сигналов образа для сети</param>
        /// <param name="outDemension">Размерность выходных сигналов образа для сети</param>
        /// <param name="numCount">Порядковый номер</param>
        /// <param name="discription">Описание образа</param>
        public TrainingImageInList(int inDemension, int outDemension, int numCount, string discription)
        {
            _number = numCount;
            Image = new TrainingImage();
            Image.InSignalsCount = inDemension;
            Image.InputSignals = new double[inDemension];
            for (int i = 0; i < inDemension; i++)
                Image.InputSignals[i] = 0;

            Image.OutputSignalsCount = outDemension;
            Image.OutputSignals = new double[outDemension];
            for (int i = 0; i < outDemension; i++)
                Image.OutputSignals[i] = 0;

            _discription = discription;            

            _isUsing = true;
        }

        #endregion

        #region Поля для DataGrid

        /// <summary>
        /// Элемент порядкового номера для DataGrid
        /// </summary>
        public int Number
        {
            get { return _number; }
            set
            {
                _number = value;
                this.NotifyPropertyChanged("Number");
            }
        }

        /// <summary>
        /// Флаг использования для DataGrid
        /// </summary>
        public bool IsUsing
        {
            get { return _isUsing; }
            set
            {
                _isUsing = value;
                this.NotifyPropertyChanged("isUsing");
            }
        }

        /// <summary>
        /// Отображение описания в DataGrid
        /// </summary>
        public string Discription
        {
            get { return _discription; }
            set
            {
                _discription = value;
                this.NotifyPropertyChanged("Discription");
            }
        }

        /// <summary>
        /// Отображение входного множества образа
        /// </summary>
        public string ImageString
        {
            get
            {
                string s = "{";
                for (int i = 0; i < Image.InSignalsCount - 1; i++)
                {
                    s += Image.InputSignals[i].ToString() + ",";
                }
                s += Image.InputSignals[Image.InSignalsCount - 1].ToString() + "}";

                return s;
            }
            private set { }
        }

        /// <summary>
        /// Отображение выходного множества образа
        /// </summary>
        public string OutImageString
        {
            get
            {
                var s = "{";
                for (var i = 0; i < Image.OutputSignalsCount - 1; i++)
                {
                    s += Image.OutputSignals[i].ToString() + ",";
                }
                s += Image.OutputSignals[Image.OutputSignalsCount - 1].ToString() + "}";

                return s;
            }
            private set { }
        }


        private void NotifyPropertyChanged(string name)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(name));
        }

        #endregion

        /// <summary>
        /// Установка образа
        /// </summary>
        /// <param name="inputSignals">Массив входных значений</param>
        /// <param name="outputSignals">Массив выходных значений</param>
        public void SetTrainingImage(double[] inputSignals, double[] outputSignals)
        {
            Image.SetTrainingImage(inputSignals, outputSignals);
        }

        /// <summary>
        /// Получение размерности входных сигналов образа
        /// </summary>
        /// <returns>Количество входных сигналов</returns>
        public int GetInDemension()
        {
            return Image.InSignalsCount;
        }

        /// <summary>
        /// Получение размерности выходных сигналов образа
        /// </summary>
        /// <returns>Количество выходных сигналов</returns>
        public int GetOutDemension()
        {
            return Image.OutputSignalsCount;
        }

        /// <summary>
        /// Получение входного сигнала
        /// </summary>
        /// <param name="Number">Номер входного сигнала</param>
        /// <returns>Значение входного сигнала</returns>
        public double GetInSignal(int Number)
        {
            return Image.InputSignals[Number];
        }

        /// <summary>
        /// Получение выходного сигнала
        /// </summary>
        /// <param name="Number">Номер выходного сигнала</param>
        /// <returns>Значение выходного сигнала</returns>
        public double GetOutSignal(int Number)
        {
            return Image.OutputSignals[Number];
        }

    }
}
